package com.zrq.xfdemo;

import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;
import com.iflytek.sunflower.FlowerCollector;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    // 语音合成对象
    private SpeechSynthesizer mTts;

    // 引擎类型
    private String mEngineType = SpeechConstant.TYPE_CLOUD;
    // 默认发音人
    private String voicer = "xiaoyan";
    // 默认的发音人编号
    private int selectedNum = 0;
    // 云端发音人列表
    private String[] mCloudVoicersEntries;
    private String[] mCloudVoicersValue;
    // 缓冲进度
    private int mPercentForBuffering = 0;
    // 播放进度
    private int mPercentForPlaying = 0;

    /**
     * UI
     */
    private EditText content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        initVoice();

    }

    private void initViews() {
        content = (EditText) findViewById(R.id.input);
    }

    private void initVoice() {

        // 云端发音人名称列表
        mCloudVoicersEntries = getResources().getStringArray(R.array.voicer_cloud_entries);
        mCloudVoicersValue = getResources().getStringArray(R.array.voicer_cloud_values);

        // 实例化语音合成对象,传入初始化监听InitListener
        Log.e(TAG, "initVoice: 实例化对象");
        mTts = SpeechSynthesizer.createSynthesizer(this, new InitListener() {
            @Override
            public void onInit(int code) {

                if (code != ErrorCode.SUCCESS) {
                    Log.e(TAG, "初始化失败,错误码：" + code);
                } else {
                    Log.e(TAG, "初始化成功：" + code);
                    // 初始化成功，之后可以调用startSpeaking方法
                    // 注：有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成，
                    // 正确的做法是将onCreate中的startSpeaking调用移至这里
                }
            }
        });
    }

    public void click(View view) {
        if( null == mTts ){
            // 创建单例失败，与 21001 错误为同样原因，参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
            Log.e(TAG, "创建对象失败，请确认 libmsc.so 放置正确，且有调用 createUtility 进行初始化");
            return;
        }
        switch (view.getId()) {
            case R.id.compose:
                compose();
                break;
            case R.id.pause:
                mTts.pauseSpeaking();
                break;
            case R.id.cancle:
                mTts.stopSpeaking();
                break;
            case R.id.resume:
                mTts.resumeSpeaking();
                break;
            case R.id.voicer:
                chooseVoicer();
                break;
        }
    }

    /**
     * 选择发音人
     */
    private void chooseVoicer() {
        new AlertDialog.Builder(this).setTitle("在线合成发音人选项")
                .setSingleChoiceItems(mCloudVoicersEntries, // 单选框有几项,各是什么名字
                        selectedNum, // 默认的选项
                        new DialogInterface.OnClickListener() { // 点击单选框后的处理
                            public void onClick(DialogInterface dialog, int which) { // 点击了哪一项

                                voicer = mCloudVoicersValue[which];

                                selectedNum = which;
                                dialog.dismiss();
                            }
                        }).show();
    }

    /**
     * 语音合成
     */
    private void compose() {
        FlowerCollector.onEvent(this, "tts_play");
        // 清空参数
        mTts.setParameter(SpeechConstant.PARAMS, null);

        // 根据合成引擎设置相应参数
        if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {
            mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
            // 设置在线合成发音人
            mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);
            //设置合成语速
            mTts.setParameter(SpeechConstant.SPEED, "50");
            //设置合成音调
            mTts.setParameter(SpeechConstant.PITCH, "50");
            //设置合成音量
            mTts.setParameter(SpeechConstant.VOLUME, "50");
        } else {
//            mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
//            // 设置本地合成发音人 voicer为空，默认通过语记界面指定发音人。
//            mTts.setParameter(SpeechConstant.VOICE_NAME, "");
//            /**
//             * TODO 本地合成不设置语速、音调、音量，默认使用语记设置
//             * 开发者如需自定义参数，请参考在线合成参数设置
//             */
        }

        // 设置播放器音频流类型
        mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
        // 设置播放合成音频打断音乐播放，默认为true
        mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");

        // 设置音频保存路径，保存音频格式支持pcm、wav，设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
        // 注：AUDIO_FORMAT参数语记需要更新版本才能生效
        mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc1/tts.wav");

        String text = content.getText().toString();

        /**
         * 语音合成（保存本地和播放)
         */
        int code = mTts.startSpeaking(text, listener);

        /**
         * 语音合成（保存本地)
         * 只保存音频不进行播放接口,调用此接口请注释startSpeaking接口
         * text:要合成的文本，uri:需要保存的音频全路径，listener:回调接口
         */
//        String path = Environment.getExternalStorageDirectory()+"/tts.pcm";
//        int code = mTts.synthesizeToUri(text, path, listener);

        if (code != ErrorCode.SUCCESS) {
            Toast.makeText(this, "语音合成失败,错误码: " + code, Toast.LENGTH_SHORT).show();
        }


    }

    SynthesizerListener listener = new SynthesizerListener() {
        @Override
        public void onSpeakBegin() {
            Log.e(TAG, "onSpeakBegin: 开始播放");
        }

        @Override
        public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
            mPercentForBuffering = percent;
            Log.e(TAG, "onBufferProgress: " + mPercentForPlaying + "/" + mPercentForBuffering);
        }

        @Override
        public void onSpeakPaused() {
            Log.e(TAG, "onSpeakPaused: 暂停播放");
        }

        @Override
        public void onSpeakResumed() {
            Log.e(TAG, "onSpeakResumed: 继续播放");
        }

        @Override
        public void onSpeakProgress(int percent, int beginPos, int endPos) {
            mPercentForPlaying = percent;
            Log.e(TAG, "onSpeakProgress: " + mPercentForPlaying + "/" + mPercentForBuffering);
        }

        @Override
        public void onCompleted(SpeechError speechError) {
            if (speechError == null) {
                Log.e(TAG, "onCompleted: 合成完成");
            } else if (speechError != null) {
                Log.e(TAG, "onCompleted: " + speechError.getPlainDescription(true));
            }
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            Log.e(TAG, "onEvent: " + eventType);
            // 以下代码用于获取与云端的会话id，当业务出错时将会话id提供给技术支持人员，可用于查询会话日志，定位出错原因
            // 若使用本地能力，会话id为null
            //	if (SpeechEvent.EVENT_SESSION_ID == eventType) {
            //		String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
            //		Log.d(TAG, "session id =" + sid);
            //	}
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (null != mTts) {
            mTts.stopSpeaking();
            // 退出时释放连接
            mTts.destroy();
        }
    }

    @Override
    protected void onResume() {
        //移动数据统计分析
        FlowerCollector.onResume(this);
        FlowerCollector.onPageStart(TAG);
        super.onResume();
    }

    @Override
    protected void onPause() {
        //移动数据统计分析
        FlowerCollector.onPageEnd(TAG);
        FlowerCollector.onPause(this);
        super.onPause();
    }
}
